Lambda/Node.jsでAWSアカウントIDとリージョンを取得する
渡辺です。
調べてすぐに出てこなかったのでメモ。
Lambdaで自身のAWSアカウントIDとリージョンが知りたい
ハードコーディングせずに他のサービスを呼び出すため、arnを作りたいです。 例えば・・・
const arn = `arn:aws:states:${region}:${accountId}:stateMachine:test`;
リージョンの取得
リージョンは環境変数から取得できます。
const region = process.env.AWS_REGION;
AWSアカウントID
AWSアカウントIDは環境変数から 取得できません 。
STS#getCallerIdentity を使う
STSの getCallerIdentity
は鉄板ですね。
const AWS = require('aws-sdk'); const sts = new AWS.STS(); const accountId = (await sts.getCallerIdentity({}).promise()).Account;
contextのinvokedFunctionArnから取得する
Lambdaの実行コンテキストに、実行されたLambda関数のARNが含まれるので、パースして取得します。
exports.handler = async (event, context) => { // ex: arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxxxxxx:function:test const accountId = context.invokedFunctionArn.split(':')[4]; }
まとめ
リージョンは環境変数から取得しましょう。
AWSアカウントIDは getCallerIdentity
か context
から取得できます。
Lambdaのハンドラーで取得してしまえば解決するなら context
、
関数の深い位置やライブラリ内で取得するならば getCallerIdentity
が無難でしょうかね。
以下、実行サンプルです。
const AWS = require('aws-sdk'); const sts = new AWS.STS(); exports.handler = async (event, context) => { console.log(process.env.AWS_REGION) const accountId = (await sts.getCallerIdentity({}).promise()).Account; console.log(accountId) const accountId2 = context.invokedFunctionArn.split(':')[4]; console.log(accountId2) return accountId; };